#ifndef _arena_h_INCLUDED
#define _arena_h_INCLUDED

#include "reference.h"
#include "stack.h"
#include "utilities.h"

#ifdef COMPACT
typedef word ward;
#else
typedef w2rd ward;
#endif

#define LD_MAX_ARENA_32 (29 - (unsigned)sizeof(ward) / 4)

#define LD_MAX_ARENA ((sizeof(word) == 4) ? LD_MAX_ARENA_32 : LD_MAX_REF)

#define MAX_ARENA ((size_t)1 << LD_MAX_ARENA)

// clang-format off

typedef STACK (ward) arena;

// clang-format on

struct clause;
struct kissat;

reference
kissat_allocate_clause(struct kissat*, size_t size);
void
kissat_shrink_arena(struct kissat*);

#if !defined(NDEBUG) || defined(LOGGING)

bool
kissat_clause_in_arena(const struct kissat*, const struct clause*);

#endif

static inline word
kissat_align_ward(word w)
{
#ifdef COMPACT
	return kissat_align_word(w);
#else
	return kissat_align_w2rd(w);
#endif
}

#endif
